package aop08;

import org.aopalliance.intercept.MethodInvocation;
import org.springframework.aop.IntroductionInterceptor;

import java.lang.reflect.Method;

public class MyIntroductionAdvice implements IntroductionInterceptor,IOtherService {
    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
        //获得当前调用的方法
        Method method=invocation.getMethod();

        //获得method所在的类型
        Class intf=method.getDeclaringClass();

        //判断当前调用的方法是否是引入的方法
        if(implementsInterface(intf)) {
            //调用引入方法
            return method.invoke(this,invocation.getArguments());
        }

        //调用目标方法
        return invocation.proceed();
    }

    //判断intf是否是引入类型
    @Override
    public boolean implementsInterface(Class<?> intf) {
        //Class intf是否是IOtherService类型或者IOtherService的子类型，如果是返回true，否则返回false
        return IOtherService.class.isAssignableFrom(intf);
    }

    @Override
    public void doOther() {
        System.out.println("MyIntroductionAdvice.doOther()");
    }
}
